﻿#include "GY_ControlTableView.h"
#include "Table/RegisterControlBase/RegisterControlBase.h"

GY_ControlTableView::GY_ControlTableView(QWidget *parent)
    : GY_IdTableView(parent)
{
    //初始化模型
    if(this->m_pModel)
    {
        m_pViewModel = this->m_pModel;
        this->setModel(m_pViewModel);
    }

}

GY_ControlTableView::~GY_ControlTableView()
{

}
/**
 * @brief setColumnCount 设置列数
 * @param columnCount 添加的列数
 */
void GY_ControlTableView::setColumnCount(const int columnCount)
{
    GY_IdTableView::setColumnCount(columnCount);
    //设置0列
    if(columnCount<=0) //设置0列及以下为无效
    {
        return;
    }
    //将列数赋值给当前列索引和列数
    m_ColumnNumber = columnCount;
}
/**
* @brief addColumn 添加空白列
* @param columnName 添加的列名
*/
void GY_ControlTableView::addColumn(const QString &columnNmae)
{
    GY_IdTableView::addColumn(columnNmae);
    //列数与当前索引数加一
    m_ColumnNumber++;
}
/**
* @brief insterColumn 插入列
* @param index 插入在第几列
* @param columnName 插入的列名
* @return 返回插入列是否成功
*/
bool GY_ControlTableView::insterColumn(const int index, const QString &columnName)
{
    bool flag = GY_IdTableView::insterColumn(index,columnName);
    if(!flag){
        return flag;
    }
    QMap<qint32,QString> tmpMap;
    //筛选出注册过的控件列从原索引map中移除并暂存
    for(auto iter = m_RegisterInfo.begin(); iter != m_RegisterInfo.end();){
        if(iter.key() >= index){
            tmpMap.insert(iter.key()+1,iter.value());
            m_RegisterInfo.erase(iter++);
        }else{
            iter++;
        }
    }
    //将暂存的控件列放入索引map中
    for(auto iter = tmpMap.begin(); iter != tmpMap.end();){
        m_RegisterInfo.insert(iter.key(),iter.value());
        iter++;
    }
    //列数与当前索引数加一
    m_ColumnNumber++;
    return true;
}
/**
* @brief deleteColumn 删除列
* @param index 删除的第几列
* @return 返回删除列是否成功
*/
bool GY_ControlTableView::deleteColumn(const int index)
{
    bool flag = GY_IdTableView::deleteColumn(index);
    if(!flag){
        return flag;
    }
    //如果删除的是控件类
    if(m_RegisterInfo.contains(index)){
        m_RegisterInfo.remove(index);
    }
    //筛选出注册过的控件列从原索引map中移除并暂存
    QMap<qint32,QString> tmpMap;
    for(auto iter = m_RegisterInfo.begin(); iter != m_RegisterInfo.end();){
        if(iter.key() > index){
            tmpMap.insert(iter.key()-1,iter.value());
            m_RegisterInfo.erase(iter++);
        }else{
            iter++;
        }
    }
    //将暂存的控件列放入索引map中
    for(auto iter = tmpMap.begin(); iter != tmpMap.end();){
        m_RegisterInfo.insert(iter.key(),iter.value());
        iter++;
    }
    //列数与当前索引数减一
    m_ColumnNumber--;
    return true;
}
/**
* @brief addRowData 添加行
* @param rowId 行Id
* @param rowData 行数据
* @return返回是否添加成功
*/
bool GY_ControlTableView::addRowData(const QVariant &rowId, const QVector<QVariant> &rowData)
{
    if(m_RowDataInfoMap.contains(rowId)||!rowData.size()||!m_pViewModel->columnCount())
    {
        return false;
    }
    QList<QStandardItem*> rowItems; //用list容器存储item
    for(int i=0;i<m_pViewModel->columnCount();i++){
        QStandardItem* pItem=new QStandardItem;
        //如果是第一列，则将行id信息存储在第一列的item中
        if(!i)
        {
            pItem->setData(rowId,TableDataType::RowIdData);
        }
        //如果是注册控件列
        int tmp_nowRowId;
        if(i == 0){
             tmp_nowRowId = m_pViewModel->rowCount();
        }else{
             tmp_nowRowId = m_pViewModel->rowCount() - 1;
        }
        if(m_RegisterInfo.contains(i)){
            QString className = m_RegisterInfo[i];
            QWidget* pWidget=WidgetReflect::newInstance(className,this); //XXXXTTTTT
            if(nullptr==pWidget)//判断实例化是否成功
            {
                pWidget=m_RegisterHash.value(className)(this);
                if(nullptr==pWidget)//判断实例化是否成功
                {
                    pItem->setText(rowData[i].toString());
                    return -1;
                }
            }
            m_pViewModel->setItem(tmp_nowRowId,i,pItem);
            pItem->setData(rowData[i],TableDataType::TransferData);
            //实例化成功后调用父类的虚函数对控件赋值
            RegisterControlBase *itemWidget = dynamic_cast<RegisterControlBase*>(pWidget);
            if(!itemWidget)
                return false;
            itemWidget->setData(rowData[i]);
            itemWidget->setPosition(tmp_nowRowId,i);
            setIndexWidget(m_pViewModel->index(tmp_nowRowId,i),pWidget);
            //绑定控件点击事件和表格的点击信号
            connect(itemWidget, &RegisterControlBase::controlDataUpdate, this, [=](const QVariant &rowID,const qint32 &columenIndex,const QVariant &data){
                emit clickedCustomWidget(rowID,columenIndex,data,pItem->index());
            });
            rowItems<<pItem;
        }else{
            if(i<rowData.size()) //如果插入的行数据的数量大于列数
            {
                pItem->setData(rowData[i],TableDataType::TransferData);
                pItem->setText(rowData[i].toString());
            }
            m_pViewModel->setItem(tmp_nowRowId,i,pItem);
            rowItems<<pItem;
        }
    }
    m_RowDataInfoMap.insert(rowId,rowItems);
    return true;
}
/**
 * @brief insertRowData 插入行数据
 * @param rowIndex 插入行索引
 * @param rowId 插入的行Id
 * @param rowData 插入的行数据
 * @return 是否插入成功
 */
bool GY_ControlTableView::insertRowData(const int rowIndex,const QVariant& rowId, const QVector<QVariant> &rowData){
    if(m_RowDataInfoMap.contains(rowId)||!rowData.size()||!m_pViewModel||!m_pViewModel->columnCount()||rowIndex>=m_pViewModel->rowCount()) //插入行数据无效
    {
        return false;
    }
    //插入当前行
    QList<QStandardItem*> rowItems; //用list容器存储item
    for(int i=0;i<m_pViewModel->columnCount();i++){
        QStandardItem* pItem=new QStandardItem;
        //如果是第一列，则将行id信息存储在第一列的item中
        if(!i)
        {
            pItem->setData(rowId,TableDataType::RowIdData);
        }
        if(m_RegisterInfo.contains(i)){
            pItem->setData(rowData[i]);
        }else{
            if(i<rowData.size()) //如果插入的行数据的数量大于列数
            {
                pItem->setText(rowData[i].toString());
            }
        }
        rowItems<<pItem;
    }
    m_RowDataInfoMap.insert(rowId,rowItems);
    m_pViewModel->insertRow(rowIndex,rowItems);
    for(int i = 0; i < m_pViewModel->columnCount(); i++){
        //如果是注册控件列
        if(m_RegisterInfo.contains(i)){
            QString className = m_RegisterInfo[i];
            QWidget* pWidget=WidgetReflect::newInstance(className,this);
            if(nullptr==pWidget)//判断实例化是否成功
            {
                pWidget=m_RegisterHash.value(className)(this);
                if(nullptr==pWidget)//判断实例化是否成功
                {
                    return -1;
                }
            }
            //实例化成功后调用父类的虚函数对控件赋值
            RegisterControlBase *itemWidget = ((RegisterControlBase*)pWidget);
            itemWidget->setData(rowData[i]);
            itemWidget->setPosition(rowIndex,i);
            setIndexWidget(m_pViewModel->index(rowIndex,i),pWidget);
            //绑定控件点击事件和表格的点击信号
            connect(itemWidget, &RegisterControlBase::controlDataUpdate, this, [=](const QVariant &rowID,const qint32 &columenIndex,const QVariant &data){
                emit clickedCustomWidget(rowID,columenIndex,data,rowItems[i]->index());
            });
        }
    }
    return true;
}
/**
 * @brief deleteRow  删除指定行
 * @param rowId 删除行Id
 * @return 返回删除是否成功
 */
bool GY_ControlTableView::deleteRow(const QVariant &rowId)
{
    GY_IdTableView::deleteRow(rowId);
    return true;
}
/**
 * @brief setRowData  修改行数据
 * @param rowId 行Id
 * @param rowData  待修改的数据
 * @return 是否修改成功
 */
bool GY_ControlTableView::setRowData(const QVariant &rowId, const QVector<QVariant> &rowData)
{
    if(!m_RowDataInfoMap.contains(rowId)||!m_RowDataInfoMap.value(rowId).size()) //修改行数据无效
    {
        return false;
    }
    int tmp_row = m_RowDataInfoMap.value(rowId)[0]->row();
    QList<QStandardItem*> rowItems;
    for(int j=0;j<qMin(m_RowDataInfoMap.value(rowId).size(),rowData.size());j++)
    {
        //判断是否为注册控件
        if(m_RegisterInfo.contains(j)){
            QWidget * widget = indexWidget(m_pViewModel->index(tmp_row,j));
            if(widget == nullptr){
                continue;
            }
            //获取到注册控件的对象并修改值
            RegisterControlBase *itemWidget = dynamic_cast<RegisterControlBase*>(widget);
            itemWidget->setData(rowData[j]);
        }else{
            QStandardItem* pNewRowItem = m_RowDataInfoMap.value(rowId).at(j);
            pNewRowItem->setData(rowData.at(j), TableDataType::TransferData);
            pNewRowItem->setText(rowData.at(j).toString());
            QList<QStandardItem *> list = m_RowDataInfoMap.value(rowId);
            list[j] = pNewRowItem;
        }
    }
    return true;
}

/**
 * @brief getRowData 获取行数据
 * @param rowId 行ID
 * @return 返回获取的行数据
 */
QVector<QVariant> GY_ControlTableView::getRowData(const QVariant &rowId)
{
    QVector<QVariant> rowDataVec;
    if(!m_RowDataInfoMap.contains(rowId))
    {
        return rowDataVec;
    }
    QList<QStandardItem*> rowItmes=m_RowDataInfoMap.value(rowId);
    for(int i=0;i<rowItmes.size();i++)
    {
        rowDataVec<< rowItmes.at(i)->data(TableDataType::TransferData);
    }
    return rowDataVec;
}

/**
 * @brief setCellData  修改单元格数据
 * @param rowId 修改行Id
 * @param columnIndex  修改列索引
 * @param cellData  要修改的数据
 * @param role 修改的数据类型
 * @return 是否修改成功
 */
bool GY_ControlTableView::setCellData(const QVariant &rowId, const int columnIndex, const QVariant &cellData, int role)
{
    //修改的单元格是否为注册控件并且是显示数据
    if(m_RegisterInfo.contains(columnIndex)){
        if(role != 0){
            return false;
        }
        if(!m_RowDataInfoMap.contains(rowId)||columnIndex>=m_RowDataInfoMap.value(rowId).size()||columnIndex<0)
        {
            return false;
        }
        int tmp_row = m_RowDataInfoMap.value(rowId)[0]->row();
        QWidget * widget = indexWidget(m_pViewModel->index(tmp_row,columnIndex));
        if(widget == nullptr){
            return false;
        }
        //获取到注册控件的对象并修改值
        RegisterControlBase *itemWidget = ((RegisterControlBase*)widget);
        itemWidget->setData(cellData);
        return true;
    }else{
        return GY_IdTableView::setCellData(rowId,columnIndex,cellData,role);
    }
}
/**
 * @brief setCellText 设置单元格文字
 * @param rowId 行ID
 * @param columnIndex 列索引
 * @param displayText 显示文字
 * @return 是否设置成功
 */
bool GY_ControlTableView::setCellText(const QVariant &rowId, const int columnIndex, const QString &displayText)
{
    if(m_RegisterInfo.contains(columnIndex)){
        return false;
    }else{
        return GY_IdTableView::setCellText(rowId,columnIndex,displayText);
    }
}
/**
 * @brief getCellData
 * @param rowId 行ID
 * @param columnIndex 列索引
 * @param role 获取的数据类型
 * @return 单元格数据
 */
QVariant GY_ControlTableView::getCellData(const QVariant &rowId, const int columnIndex, int role)
{
    if(m_RegisterInfo.contains(columnIndex)){
        return QVariant();
    }else{
        return GY_IdTableView::getCellData(rowId,columnIndex,role);
    }
}
/**
 * @brief getCellText 获取单元格文字
 * @param rowId 行ID
 * @param columnIndex 列索引
 * @return 单元格文字
 */
QString GY_ControlTableView::getCellText(const QVariant &rowId, const int columnIndex)
{
    if(m_RegisterInfo.contains(columnIndex)){
        return "";
    }else{
        return GY_IdTableView::getCellText(rowId,columnIndex);
    }
}

/**
 * @brief getRowCount 获取表格行数
 */
int GY_ControlTableView::getRowCount()
{
    if(m_pViewModel)
    {
        return m_pViewModel->rowCount();
    }
    return 0;
}
